import { AppContext } from '@/pages/App/context'
import { useContext, useEffect, useState } from 'react'
import { CurrentEnvEnableProps, SidebarRouterProps } from './routerInterface'
import { getSidebarRouter, currentRole } from './sidebarRouter'
/**
 * 通过路由配置，更新出要展示的菜单项
 * @returns sidebarMenu 所有可展示的菜单
 */
const useMenusHook = () => {
	const { user: userInfo, system: systemInfo } = useContext(AppContext)
	/**所有路由配置项 */
	let { sidebarRouter } = getSidebarRouter()
	const currentEnvEnable: CurrentEnvEnableProps = {}
	/**
	 * 该环境下是否可以展示某些菜单
	 * @param env 依赖的环境集合
	 * @returns true：可以展示，false：不展示，默认所依赖的环境都支持展示
	 */
	const isEnvEnable = (env?: string[]) => {
		if (env) {
			for (let i = 0; i < env.length; i++) {
				//只有有一个依赖的环境能力，不支持，则不展示
				if (!currentEnvEnable[env[i]]) {
					return false
				}
			}
		}
		return true
	}
	/**
	 * 该登录的用户是否有权限展示某些菜单
	 * @param env 依赖的环境集合
	 * @returns true：可以展示，false：不展示，默认所依赖的环境都支持展示
	 */
	const isUserEnable = (userEnable?: string[]) => {
		if (userEnable) {
			for (let i = 0; i < userEnable.length; i++) {
				//只有有一个依赖的环境能力，不支持，则不展示
				if (!userInfo[userEnable[i]]) {
					return false
				}
			}
		}
		return true
	}
	/**
	 * 该角色下是否可以展示
	 * @param roles 角色集合，该集合下的角色都可以展示
	 * @returns true：可以展示，false：不展示，默认所依赖的环境都支持展示
	 */
	const isRoleEnable = (roles?: string[]) => {
		let flag = true
		if (roles) {
			flag = roles.includes(currentRole)
		}
		return flag
	}
	const isShowMenu = (menu: SidebarRouterProps) => {
		let isShowInMenus = menu.isShowInMenus !== false
		let env = menu.meta ? menu.meta.env : undefined
		let roles = menu.meta ? menu.meta.roles : undefined
		let userEnable = menu.meta ? menu.meta.userEnable : undefined
		return isShowInMenus && isEnvEnable(env) && isUserEnable(userEnable) && isRoleEnable(roles)
	}
	function screenRoutesByRole(routes: SidebarRouterProps[]): SidebarRouterProps[] {
		return routes
			.map((route) => {
				if (route.meta) {
					if (!isShowMenu(route)) return null
				}
				if (!route.children) return route
				route.children = screenRoutesByRole(route.children)
				return route
			})
			.filter((i) => i !== null) as SidebarRouterProps[]
	}
	const [sidebarMenu, setSidebarMenu] = useState<SidebarRouterProps[]>(screenRoutesByRole(sidebarRouter))
	useEffect(() => {
		setSidebarMenu(screenRoutesByRole(sidebarRouter))
		// eslint-disable-next-line react-hooks/exhaustive-deps
	}, [userInfo, systemInfo])
	return {
		sidebarMenu,
	}
}
export default useMenusHook
